#ifndef PACKDEF_H
#define PACKDEF_H

#define _default_protocol_base  1
//申请账号
#define _default_procotol_register_rq   _default_protocol_base +1
#define _default_procotol_register_rs   _default_protocol_base +2
//登录
#define _default_procotol_login_rq   _default_protocol_base +3
#define _default_procotol_login_rs   _default_protocol_base +4
//获取文件列表
#define _default_procotol_getfilelist_rq   _default_protocol_base +5
#define _default_procotol_getfilelist_rs   _default_protocol_base +6
//上传文件
#define _default_procotol_uploadfileinfo_rq   _default_protocol_base +7
#define _default_procotol_uploadfileinfo_rs   _default_protocol_base +8

#define _default_procotol_uploadfileblock_rq   _default_protocol_base +9
#define _default_procotol_uploadfileblock_rs   _default_protocol_base +10
//下载文件
#define _default_procotol_downloadfileinfo_rq   _default_protocol_base +11
#define _default_procotol_downloadfileinfo_rs   _default_protocol_base +12
#define _default_procotol_downloadfileblock_rq   _default_protocol_base +13
#define _default_procotol_downloadfileblock_rs   _default_protocol_base +14
//搜索文件
#define _default_procotol_searchfile_rq   _default_protocol_base + 17
#define _default_procotol_searchfile_rs   _default_protocol_base + 18
//删除文件
#define _default_procotol_deletefile_rq   _default_protocol_base + 15
#define _default_procotol_deletefile_rs   _default_protocol_base + 16
// 添加预览文件协议
#define _default_procotol_preview_rq   _default_protocol_base + 19
#define _default_procotol_preview_rs   _default_protocol_base + 20

#define _default_procotol_rename_rq   _default_protocol_base + 21
#define _default_procotol_rename_rs   _default_protocol_base + 22
//协议包
#define MAXSIZE 45
#define FILENUM 15
#define SQLLEN 300
#define registerfail 0
#define registersuccess 1

#define loginusernoexist 0
#define loginpassword_err 1
#define loginsuccess 2
#define ONEPAGE 4096
#define uploadfileinfo_isuploaded   0
#define uploadfileinfo_continue     1
#define uploadfileinfo_flash        2//秒传
#define uploadfileinfo_normal       3//正常传
//？？？
// 下载结果状态码
#define downloadfileinfo_file_not_exist   0
#define downloadfileinfo_file_exist       1

//？？？
// 删除结果状态码
#define deletefile_success     1
#define deletefile_fail        0
#define deletefile_not_exist   2

// 预览结果状态码
#define preview_success 1
#define preview_fail 0
#define preview_not_supported 2

enum UploadStatus {
    UPLOAD_WAITING = 0,   // 等待上传
    UPLOAD_UPLOADING = 1, // 上传中
    UPLOAD_PAUSED = 2,    // 已暂停
    UPLOAD_COMPLETED = 3, // 已完成
    UPLOAD_FAILED = 4     // 失败
};

//申请账号
struct STRU_BASE{
    char m_ntype;
};
struct STRU_REGISTER_RQ :public STRU_BASE{
    STRU_REGISTER_RQ(){
        m_ntype = _default_procotol_register_rq;
    }
    char m_szName[MAXSIZE];
    char m_szPassword[MAXSIZE];
    long long m_tel;
};
struct STRU_REGISTER_RS :public STRU_BASE{
    STRU_REGISTER_RS(){
        m_ntype = _default_procotol_register_rs;
    }
    char m_szResult;
};
//登录
struct STRU_LOGIN_RQ :public STRU_BASE{
    STRU_LOGIN_RQ(){
        m_ntype = _default_procotol_login_rq;
    }
    char m_szName[MAXSIZE];
    char m_szPassword[MAXSIZE];

};
struct STRU_LOGIN_RS :public STRU_BASE{
    STRU_LOGIN_RS(){
        m_ntype = _default_procotol_login_rs;
    }
    long long m_userId;
    char m_szResult;
};
//获取文件列表
struct STRU_GETFILELIST_RQ :public STRU_BASE{
    STRU_GETFILELIST_RQ(){
        m_ntype = _default_procotol_getfilelist_rq;
    }
    long long m_userId;
    int m_pageIndex;    // 当前页码（从0开始）
    int m_pageSize;     // 每页文件数量

};
//固定 protocolbuf
struct FILEINFO{
    char m_szFileName[MAXSIZE];
    long long m_filesize;
    char m_szFileUploadTime[MAXSIZE];
};
struct STRU_GETFILELIST_RS :public STRU_BASE{
    STRU_GETFILELIST_RS(){
        m_ntype = _default_procotol_getfilelist_rs;
    }
    long long m_userId;
    FILEINFO m_aryFileInfo[FILENUM];
    int m_nFileNum;
    int m_totalCount;     // 文件总数
    int m_pageIndex;      // 当前页码
    int m_pageSize;       // 每页文件数量

};
struct STRU_UPLOADFILEINFO_RQ:public STRU_BASE{
    STRU_UPLOADFILEINFO_RQ(){
        m_ntype = _default_procotol_uploadfileinfo_rq;
    }
    long long m_userId;
    char m_szFileName[MAXSIZE];
    long long m_filesize;
    char m_szFileUploadTime[MAXSIZE];
    char m_szFileMD5[MAXSIZE];
    long m_filepos;
};
struct STRU_UPLOADFILEINFO_RS:public STRU_BASE{
    STRU_UPLOADFILEINFO_RS(){
        m_ntype = _default_procotol_uploadfileinfo_rs;
    }
    char m_szFileName[MAXSIZE];
    char m_szFileMD5[MAXSIZE];
    long long m_fileId;
    char m_szResult; //如果服务器没有此文件，正常传   如果有（我曾经传过的，重复上传） 但是没有传完，断点续传  如果有，完整的文件 秒传
    long m_filepos;

};
struct STRU_UPLOADFILEBLOCK_RQ:public STRU_BASE{
    STRU_UPLOADFILEBLOCK_RQ(){
        m_ntype = _default_procotol_uploadfileblock_rq;
    }
    long long m_userId;
    long long m_fileId;

    char m_szFileContent[ONEPAGE];
    int m_fileblocksize;
};
struct STRU_UPLOADFILEBLOCK_RS : public STRU_BASE {
    STRU_UPLOADFILEBLOCK_RS() {
        m_ntype = _default_procotol_uploadfileblock_rs;
    }
    long long m_fileId;
    char m_blockResult; // 0=失败，1=成功
};



//？？？？？？？？
// 下载文件请求
struct STRU_DOWNLOADFILEINFO_RQ :public STRU_BASE{
    STRU_DOWNLOADFILEINFO_RQ(){
        m_ntype = _default_procotol_downloadfileinfo_rq;
    }
    long long m_userId;
    char m_szFileName[MAXSIZE]; // 要下载的文件名
};

// 下载文件回复
struct STRU_DOWNLOADFILEINFO_RS :public STRU_BASE{
    STRU_DOWNLOADFILEINFO_RS(){
        m_ntype = _default_procotol_downloadfileinfo_rs;
    }
    char m_szFileName[MAXSIZE];
    long long m_filesize;
    long long m_fileId;
    char m_szFileMD5[MAXSIZE];
    int m_nResult; // 0:文件不存在 1:存在
};

// 下载文件块请求
struct STRU_DOWNLOADFILEBLOCK_RQ :public STRU_BASE{
    STRU_DOWNLOADFILEBLOCK_RQ(){
        m_ntype = _default_procotol_downloadfileblock_rq;
    }
    long long m_fileId;
    long long m_pos; // 请求的文件块起始位置
};

// 下载文件块回复
struct STRU_DOWNLOADFILEBLOCK_RS :public STRU_BASE{
    STRU_DOWNLOADFILEBLOCK_RS(){
        m_ntype = _default_procotol_downloadfileblock_rs;
    }
    long long m_fileId;
    long long m_pos; // 当前文件块在文件中的位置
    int m_blockSize; // 当前文件块的大小
    char m_szFileContent[ONEPAGE]; // 文件块内容
};
//？？？？？？？？？？？

// 删除文件请求
struct STRU_DELETEFILE_RQ : public STRU_BASE {
    STRU_DELETEFILE_RQ() {
        m_ntype = _default_procotol_deletefile_rq;
    }
    long long m_userId;
    char m_szFileName[MAXSIZE]; // 要删除的文件名
};

// 删除文件响应
struct STRU_DELETEFILE_RS : public STRU_BASE {
    STRU_DELETEFILE_RS() {
        m_ntype = _default_procotol_deletefile_rs;
    }
    char m_szFileName[MAXSIZE];
    int m_nResult; // 0:失败 1:成功 2:文件不存在
};

// 搜索类型枚举
enum SearchType {
    SEARCH_BY_NAME = 0,     // 按完整文件名
    SEARCH_BY_PARTIAL = 1,   // 按文件名部分
    SEARCH_BY_TIME = 2       // 按上传时间
};

// 搜索请求
struct STRU_SEARCHFILE_RQ : public STRU_BASE {
    STRU_SEARCHFILE_RQ() {
        m_ntype = _default_procotol_searchfile_rq;
    }
    long long m_userId;
    int m_searchType;        // 搜索类型 (SearchType)
    char m_searchKey[MAXSIZE]; // 搜索关键字
    char m_startTime[MAXSIZE]; // 时间范围搜索开始时间
    char m_endTime[MAXSIZE];   // 时间范围搜索结束时间
    int m_pageIndex;         // 当前页码
    int m_pageSize;          // 每页数量
};

// 搜索结果响应
struct STRU_SEARCHFILE_RS : public STRU_BASE {
    STRU_SEARCHFILE_RS() {
        m_ntype = _default_procotol_searchfile_rs;
    }
    long long m_userId;
    int m_totalCount;        // 总结果数
    int m_pageIndex;         // 当前页码
    int m_pageSize;          // 每页数量
    FILEINFO m_aryFileInfo[FILENUM]; // 当前页结果
    int m_nFileNum;          // 当前页文件数量
};


// 预览请求
struct STRU_PREVIEW_RQ : public STRU_BASE {
    STRU_PREVIEW_RQ() {
        m_ntype = _default_procotol_preview_rq;
    }
    long long m_userId;
    char m_szFileName[MAXSIZE]; // 要预览的文件名
};

// 预览响应
struct STRU_PREVIEW_RS : public STRU_BASE {
    STRU_PREVIEW_RS() {
        m_ntype = _default_procotol_preview_rs;
    }
    char m_szFileName[MAXSIZE];
    int m_fileSize;          // 文件大小
    char m_szFileContent[1024]; // 预览内容
    int m_nResult; // 0:失败 1:成功 2:文件类型不支持预览
    char m_szFileType[20];   // 文件类型
};


// 重命名请求
struct STRU_RENAME_RQ : public STRU_BASE {
    STRU_RENAME_RQ() {
        m_ntype = _default_procotol_rename_rq;
    }
    long long m_userId;
    char m_szOldFileName[MAXSIZE];
    char m_szNewFileName[MAXSIZE];
};

// 重命名响应
struct STRU_RENAME_RS : public STRU_BASE {
    STRU_RENAME_RS() {
        m_ntype = _default_procotol_rename_rs;
    }
    int m_nResult; // 0:失败 1:成功 2:文件不存在 3:新文件名已存在
    char m_szOldFileName[MAXSIZE];
    char m_szNewFileName[MAXSIZE];
};

#endif // PACKDEF_H
